﻿//TransactionIdGenerator.cs
//Copyright (c) 2013 StockSharp LLC, all rights reserved.
//This code module is part of StockSharp library.
//This code is licensed under the GNU GENERAL PUBLIC LICENSE Version 3.
//See the file License.txt for the license details.
//More info on: http://stocksharp.com

namespace StockSharp.Algo
{
	using System;

	using Ecng.Common;

	/// <summary>
	/// Базовый генератор идентификаторов транзакций.
	/// </summary>
	public abstract class TransactionIdGenerator
	{
		/// <summary>
		/// Получить следующий номер идентификатора транзакции.
		/// </summary>
		/// <returns>Следующий номер идентификатора транзакции.</returns>
		public abstract long GetNextId();
	}

	/// <summary>
	/// Генератор идентификаторов транзакций, основанный на автоматическом увеличении <see cref="CurrentTransactionId"/> на 1.
	/// </summary>
	public class IncrementTransactionIdGenerator : TransactionIdGenerator
	{
		private readonly IdGenerator _generator = new IdGenerator();

		/// <summary>
		/// Создать генератор.
		/// </summary>
		public IncrementTransactionIdGenerator()
		{
			CurrentTransactionId = (long)(DateTime.Now - DateTime.Today).TotalMilliseconds;
		}

		/// <summary>
		/// Номер текущей транзакции. Первоначальное значение равно количество миллисекунд, прошедшее с начала дня.
		/// </summary>
		public long CurrentTransactionId
		{
			get { return _generator.Current; }
			set { _generator.Current = value; }
		}

		/// <summary>
		/// Получить следующий номер идентификатора транзакции.
		/// </summary>
		/// <returns>Следующий номер идентификатора транзакции.</returns>
		public override long GetNextId()
		{
			return _generator.Next;
		}
	}

	/// <summary>
	/// Генератор идентификаторов транзакций, основанный на миллисекундах. Каждый следующий вызов метода <see cref="GetNextId"/>
	/// будет возвращать количество миллисекунд, прошедшее с начала создания генератора.
	/// </summary>
	public class MillisecondTransactionIdGenerator : TransactionIdGenerator
	{
		private readonly DateTime _start;

		/// <summary>
		/// Создать генератор.
		/// </summary>
		public MillisecondTransactionIdGenerator()
		{
			_start = DateTime.Now;
		}

		/// <summary>
		/// Получить следующий номер идентификатора транзакции.
		/// </summary>
		/// <returns>Следующий номер идентификатора транзакции.</returns>
		public override long GetNextId()
		{
			return (long)(DateTime.Now - _start).TotalMilliseconds;
		}
	}
}